package com.probiz.estore.common.service;


import java.util.List;

import com.probiz.estore.common.model.product.Product;
import com.probiz.estore.common.model.product.ProductSku;
import com.probiz.estore.eai.exception.EaiException;
import com.probiz.estore.eai.product.generated.Inventory;
import com.probiz.estore.exception.OutOfStockException;
import com.probiz.estore.exception.ProductNoExistException;
import com.probiz.estore.exception.UnderMinimumPurchaseQuantityException;

public interface ProductService {
	
	/**
	 * 根据product主键获取实体
	 * @param productId 产品主键
	 * @return Product 产品实体
	 */
	public Product getById(Integer productId);
	/**
	 * 根据productSkuCode(规格SKU编号)获得ProductSku实体
	 * @param productSkuCode 规格SKU编号
	 * @return ProductSku SKU实体
	 */
	public ProductSku getProductSkuByProductSkuCode(String productSkuCode);
	
	/**
	 * 根据productSkuCode(规格SKU编号)获得ProductSku实体,与hibernate session彻底脱离
	 * @param productSkuCode SKU编号
	 * @return 规格实体
	 */
	public ProductSku getProductSkuPojoByProductSkuCode(String productSkuCode);

	
	/**
	 * 根据产品目录和显示标志获得产品列表
	 * @param categoryId 产品目录id
	 * @param displayFlag 显示标志 new Product.DISPLAYFLAG_NEW;  hot Product.DISPLAYFLAG_HOT
	 * @param size 最多显示个数
	 * @return List<Product>
	 */
	public List<Product> getProductsByCategoryAndDisplayFlag(final Integer categoryId,final Short displayFlag,final int size);
	
	/**
	 * 增加一次购买次数
	 * @param productId 产品主键
	 */
	public void doIncreaseOneBuyTimes(Integer productId); 
	/**
	 * 改变累积购买数量
	 * @param productId
	 * @param buyCount (可为正或负数)
	 * 
	 */
	public void doUpdateStatBuyCount(Integer productId,Integer buyCount); 
	
	/**
	 * 判断sku是否在该目录下
	 * @param productSkuId
	 * @param categoryId
	 * @return
	 */
	public boolean isInCategoryBySku(Integer productSkuId,Integer categoryId);
	
	
	/**
	 * EAI数据导入，新增或者更新单个产品(存货档案)
	 * @param inventory 存货档案信息实体
	 */
	public void doImportProductForEai(Inventory inventory) throws EaiException;
	
	/**
	 * EAI数据导入，新增、更新或者删除多个产品(存货档案)
	 * @param inventoryList 存货档案信息实体列表
	 */
	public void doImportProductsForEai(List<Inventory> inventoryList) throws EaiException;
	/**
	 * 检查最低购买量
	 * @param productSkuCode 商品编码
	 * @param quantity  数量
	 * @throws UnderMinimumPurchaseQuantityException 
	 */
	public void checkMinPurchaseQuantity(String productSkuCode, Integer quantity) throws UnderMinimumPurchaseQuantityException; 
	
	/**
	 * 检查库存
	 * @param productSkuCode 商品编码
	 * @param quantity 数量
	 * @throws OutOfStockException
	 */
	public void checkInventory(String productSkuCode, Integer quantity) throws OutOfStockException ;
	/**
	 * 检查购买数量（分别为检查最低购买量和检查库存）
	 * @param productSkuCode 商品编码
	 * @param quantity
	 * @throws UnderMinimumPurchaseQuantityException OutOfStockException
	 */
	public void checkBuyQuantity(String productSkuCode, Integer quantity) throws UnderMinimumPurchaseQuantityException, OutOfStockException;

	/**
	 * 用于验证：加入购物车如果有配件缺货。
	 * 
	 * */
	public ProductSku checkInventoryError(String productSkuCode, Integer quantity);
	
	/**
	 * 检查商品，SKU是否存在
	 * @param productSkuCode 商品编码
	 * @param childrens SKU
	 * @throws ProductNoExistException
	 */
	public void checkProductIsExist(String productSkuCode, String [] childrens) throws ProductNoExistException ;
}
